home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
fb386
/
tool
/
watanabe
/
mouse
/
mouse.bas
< prev
next >
Wrap
BASIC Source File
|
1995-01-19
|
14KB
|
374 lines
1000 '********************************************************************
1010 '* プログラム開発支援シリーズ第1弾 *
1020 '* *
1030 '* マウスカーソル編集プログラム Ver 2.55 *
1040 '* 1995年1月14日(土) by 渡辺 良一 *
1050 '********************************************************************
1060 CLEAR ,,1024,200000,6,0:STOP OFF
1070 DEF FONT"システム 16ドット"
1080 DEFINT A-Z,取
1090 LOADM"keyclear.rex",0
1100 DIM M(1,31,31),MC(1,31,31),A(1,31,31),PA(63),PD(63)
1110 EX=561:EY=9:CL=0
1120 A&=VARPTR(PA(0)):D&=VARPTR(PD(0))
1130 'マウス初期パターン読み込み
1140 OPEN"I",#1,"mouse.dot"
1150 FOR D=0 TO 1
1160 FOR Y=0 TO D*16+15
1170 FOR I=0 TO D*16+14 STEP 4
1180 V=ASC(INPUT$(1,1)):W=64
1190 FOR X=0 TO 3
1200 MC(D,X+I,Y)=V \ W
1210 V=V-MC(D,X+I,Y)*W
1220 W=W/4
1230 NEXT X,I,Y,D
1240 CLOSE #1
1250 '********* 画面初期化 ****************************
1260 SCREEN 0:SCREEN@0
1270 WINDOW(0,0)-(1023,511)
1280 VIEW (0,0)-(1023,511)
1290 PALETTE 0 ,[0,0,0] '黒
1300 PALETTE 9 ,[0,0,255] '青
1310 PALETTE 10,[0,255,0] '赤
1320 PALETTE 12,[255,0,0] '緑
1330 PALETTE 13,[128,128,128] '灰
1340 PALETTE 14,[180,150,200] '黄緑
1350 PALETTE 15,[255,255,255] '白
1360 '******* 編集場所表示 **************************
1370 *画面表示
1380 ON ERROR GOTO 0
1390 ER=0:COLOR 1,1,1,0:CLS
1400 FOR D=16 TO 32 STEP 16
1410 IF D=16 THEN XX=350 ELSE XX=0
1420 LINE(XX,0)-STEP(D*10,D*10),PSET,4,BF,4
1430 FOR X=0 TO D
1440 IF X AND 15 THEN C=6:M=1 ELSE C=2:M=0
1450 LINE(XX+X*10,M)-STEP(0,D*10-M*2),PSET,C
1460 NEXT
1470 FOR Y=0 TO D
1480 IF Y AND 15 THEN C=6:M=1 ELSE C=2:M=0
1490 LINE(XX+M,Y*10)-STEP(D*10-M*2,0),PSET,C
1500 NEXT Y,D
1510 '******* コマンド表示 ************************
1520 RESTORE
1530 FOR Y=EY TO EY+133 STEP 19
1540 READ C$,C
1550 LINE(EX,Y)-STEP(50,19),PSET,0,BF,5
1560 SYMBOL(EX+3,Y+2),C$,1,1,7
1570 IF C<>8 THEN LINE(EX+34,Y)-STEP(16,19),PSET,0,BF,C
1580 NEXT
1590 C0=1:GOSUB *C_C
1600 '******* 実物表示 *****************************
1610 ZX=350:ZY=200
1620 LINE(ZX,ZY) -STEP(100,40),PSET,0,BF,5
1630 LINE(ZX,ZY+20) -STEP(100,0) ,PSET,0
1640 LINE(ZX,ZY+40) -STEP(100,50),PSET,0,B
1650 LINE(ZX+50,ZY+20)-STEP( 0,70),PSET,0
1660 LINE(14,401)-(626,419),PSET,0,BF,5
1670 IF URA THEN C0=7:C1=0:GOSUB *スイッチ
1680 SYMBOL(ZX+26,ZY+2) ,"実物大",1,1,7
1690 SYMBOL(ZX+5 ,ZY+22),"32dot" ,1,1,7
1700 SYMBOL(ZX+55,ZY+22),"16dot" ,1,1,7
1710 SYMBOL(16,402),"マウスカーソル編集プログラム Version 2.55 Copyright (C) Ryoichi.Watanabe" ,1,1,7
1720 IF E_字数 THEN
1730 FOR D=0 TO 1
1740 FOR Y=0 TO D*16+15
1750 FOR X=0 TO D*16+15
1760 IF M(D,X,Y)<>2 THEN GOSUB *描く
1770 NEXT X,Y,D
1780 ELSE
1790 MOUSE 0 'マウス初期化
1800 MOUSE 3,0,INP(&H3B06):MOUSE 3,1,INP(&H3B06) 'マウス移動比率設定
1810 MOUSE 1,0,0,1 'マウス表示
1820 S=1
1830 D=0:GOSUB *クリア
1840 D=1:GOSUB *クリア:S=0
1850 ENDIF
1860 CALLM 0:COLOR 7
1870 '
1880 'メインルーチン
1890 *メイン
1900 K$="":WHILE NOT(MOUSE(2,0)) AND K$="":K$=INKEY$:WEND
1910 IF K$=CHR$(27) THEN *END 'esc
1920 X=MOUSE(0):Y=MOUSE(1)
1930 IF (X<320 AND Y<320) OR (349<X AND X<510 AND Y<160) THEN
1940 IF X<320 THEN D=1 ELSE D=0:X=X-350
1950 X=X\10:Y=Y\10
1960 IF M(D,X,Y)<>CL THEN M(D,X,Y)=CL:GOSUB *描く
1970 ELSE IF 13=<X AND X=<620 AND 400=<Y AND Y=<420 AND MOUSE(2,0) THEN
1980 URA=-1
1990 C0=0:C1=7:GOSUB *スイッチ
2000 WHILE 13=<MOUSE(0) AND MOUSE(0)=<620 AND 400=<MOUSE(1) AND MOUSE(1)<=420 AND MOUSE(2,0):WEND
2010 C0=7:C1=0:GOSUB *スイッチ
2020 ELSE IF ZY+40<Y AND Y<ZY+90 AND ZX<X THEN
2030 IF X<ZX+50 THEN
2040 GOSUB *GET_32
2050 MOUSE 6,0,PA,PD
2060 ELSE IF X<ZX+100 THEN
2070 GOSUB *GET_16
2080 MOUSE 2,A$,D$
2090 ENDIF
2100 ELSE IF X<EX OR EX+50<X OR Y<EY THEN
2110 GOTO *メイン
2120 ELSE IF Y<EY+19 THEN
2130 GOTO *END
2140 ELSE IF Y<EY+38 THEN
2150 GOSUB *GET_32
2160 GOSUB *ファイル選択
2170 FL$=E_文字$:ER=1
2180 IF D THEN
2190 OPEN "O",#1,FL$
2200 FOR I=0 TO 63
2210 PRINT#1,MKI$(PA(I));MKI$(PD(I));
2220 NEXT
2230 CLOSE #1
2240 ELSE
2250 GOSUB *GET_16
2260 OPEN"O",#1,FL$
2270 PRINT#1,A$;D$;
2280 CLOSE #1
2290 ENDIF
2300 GOTO *画面表示
2310 ELSE IF Y<EY+57 THEN
2320 GOSUB *ファイル選択:ER=2
2330 IF D THEN
2340 OPEN"I",#1,FL$
2350 FOR I=0 TO 63
2360 PA(I)=CVI(INPUT$(2,1))
2370 PD(I)=CVI(INPUT$(2,1))
2380 NEXT
2390 CLOSE #1
2400 'データ変換
2410 I=0
2420 FOR Y=0 TO 31
2430 FOR XX=0 TO 24 STEP 8
2440 A=PEEK(A&+I):D=PEEK(D&+I)
2450 I=I+1:W=&H100
2460 FOR X=0 TO 7
2470 W=W/2
2480 IF ((A OR D) AND W)=0 THEN M(1,XX+X,Y)=0 ELSE IF (A AND W)=0 AND D AND W THEN M(1,XX+X,Y)=1 ELSE M(1,XX+X,Y)=2
2490 NEXT X,XX,Y
2500 ELSE
2510 OPEN"I",#1,FL$
2520 A$=INPUT$(64,1)
2530 CLOSE #1
2540 FOR Y=0 TO 15
2550 FOR I=0 TO 1
2560 A=ASC(MID$(A$,Y*2+I+ 1,1))
2570 D=ASC(MID$(A$,Y*2+I+33,1)):W=&H100
2580 FOR X=0 TO 7
2590 W=W/2
2600 IF ((A OR D) AND W)=0 THEN M(0,I*8+X,Y)=0 ELSE IF A AND W AND (D AND W)=0 THEN M(0,I*8+X,Y)=2 ELSE M(0,I*8+X,Y)=1
2610 NEXT X,I,Y
2620 ENDIF
2630 GOTO *画面表示
2640 ELSE IF Y<EY+95 THEN
2650 IF Y<EY+76 THEN D=0 ELSE D=1
2660 GOSUB *クリア:GOTO *メイン
2670 ELSE IF Y<EY+152 THEN
2680 IF Y<EY+114 THEN CC=0 ELSE IF Y<EY+133 THEN CC=1 ELSE CC=2
2690 IF CL<>CC THEN C0=0:GOSUB *C_C:CL=CC:C0=1:GOSUB *C_C
2700 ENDIF
2710 GOTO *メイン
2720 '
2730 '
2740 *クリア
2750 FOR Y=0 TO D*16+15
2760 FOR X=0 TO D*16+15
2770 IF S=1 THEN M(D,X,Y)=2
2780 IF M(D,X,Y)<>MC(D,X,Y) THEN M(D,X,Y)=MC(D,X,Y):GOSUB *描く
2790 NEXT X,Y
2800 RETURN
2810 *C_C 'カラーカーソル表示
2820 IF CL=0 THEN Y0=EY+96 ELSE IF CL=1 THEN Y0=EY+115 ELSE Y0=EY+134
2830 IF C0 THEN
2840 SYMBOL(EX-17,Y0),"→",1,1,2
2850 ELSE
2860 LINE(EX-17,Y0)-STEP(16,16),PSET,,BF
2870 ENDIF
2880 RETURN
2890 '
2900 *描く
2910 IF D=0 THEN X2=350:X3=ZX+67:Y3=ZY+57 ELSE X2=0:X3=ZX+9:Y3=ZY+49
2920 IF M(D,X,Y)=0 THEN C=0 ELSE IF M(D,X,Y)=1 THEN C=7 ELSE C=4
2930 LINE(X2+X*10+1,Y*10+1)-STEP(8,8),PSET,C,BF,C
2940 IF C=4 THEN C=1
2950 PSET(X3+X,Y3+Y),C
2960 RETURN
2970 '
2980 *GET_16 'andパターンとドットパターンを作成する
2990 A$="":D$=""
3000 FOR Y=0 TO 15:FOR I=0 TO 8 STEP 8
3010 W=128:A=0:D=0
3020 FOR X=0 TO 7
3030 IF M(0,X+I,Y)=2 THEN A=(A OR Z):A(0,X+I,Y)=1 ELSE A(0,X+I,Y)=0
3040 IF M(0,X+I,Y)=1 THEN D=(D OR Z):A(1,X+I,Y)=1 ELSE A(1,X+I,Y)=0
3050 W=W/2
3060 NEXT
3070 A$=A$+CHR$(A)
3080 D$=D$+CHR$(D)
3090 NEXT I,Y
3100 RETURN
3110 *GET_32
3120 I=0
3130 FOR Y=0 TO 31
3140 FOR XX=0 TO 24 STEP 8
3150 W=&H100:A=0:D=0
3160 FOR X=0 TO 7
3170 W=W/2
3180 IF M(1,XX+X,Y)=1 THEN D=D OR W ELSE IF M(1,XX+X,Y)=2 THEN A=A OR W
3190 NEXT
3200 POKE A&+I,A,1:POKE D&+I,D,1
3210 I=I+1
3220 NEXT XX,Y
3230 RETURN
3240 '
3250 *スイッチ'(13,400)-(627,420)
3260 LINE( 13,400)-(627,401),PSET,C0,BF,C0
3270 LINE( 13,402)-( 14,418),PSET,C0,BF,C0
3280 LINE( 15,419)-(627,420),PSET,C1,BF,C1
3290 LINE(626,402)-(627,418),PSET,C1,BF,C1
3300 RETURN
3310 '
3320 *ファイル選択
3330 E_字数=77:E_X=1:E_CR0=0:E_CR1=2
3340 COLOR 7,0:CLS
3350 PRINT"どっちを";
3360 IF Y<EY+38 THEN PRINT"セーブしますか" ELSE PRINT"ロードしますか"
3370 PRINT"16×16ドット・32×32ドット"
3380 PRINT"マウスで左クリック 右クリックで取消"
3390 *二択
3400 XX=MOUSE(0):YY=MOUSE(1)
3410 IF MOUSE(2,1) THEN RETURN *画面表示 '右クリック
3420 IF NOT(MOUSE(2,0)) THEN *二択
3430 IF XX< 97 AND 18<YY AND YY<36 THEN D=0 ELSE IF 111<XX AND XX<209 AND 18<YY AND YY<36 THEN D=1 ELSE *二択
3440 IF D THEN PRINT"32×32ドットを"; ELSE PRINT"16×16ドットを";
3450 IF Y<EY+38 THEN PRINT"セーブします。" ELSE PRINT"ロードします。"
3460 PRINT"ファイル名を入力してください。"
3470 ON ERROR GOTO *ERR
3480 *入力
3490 COLOR 7:E_Y=CSRLIN:PRINT">":IF E_Y=>CSRLIN THEN E_Y=E_Y-1
3500 E_文字$="":取消=0:GOSUB *文字編集
3510 IF E_文字$="" OR 取消 THEN RETURN *画面表示
3520 FL$=E_文字$:L$=LEFT$(E_文字$,3)
3530 IF L$<>"DIR" AND L$<>"dir" THEN RETURN
3540 FL$=MID$(E_文字$,4)
3550 WHILE LEFT$(FL$,1)=CHR$(32)
3560 FL$=MID$(FL$,2)
3570 WEND
3580 WHILE KRIGHT$(FL$,1)=CHR$(32)
3590 FL$=KLEFT$(FL$,KLEN(FL$)-1)
3600 WEND
3610 ER=0:FILES FL$
3620 GOTO *入力
3630 *ERR
3640 BEEP
3650 IF ER=0 THEN PRINT"ファイルが見つかりません。":RESUME *入力
3660 IF ER=1 THEN PRINT"セーブに失敗しました。" ELSE PRINT"ロードに失敗しました。"
3670 CALLM 0:WHILE INKEY$="":WEND
3680 ER=0:RESUME *画面表示
3690 '
3700 *END
3710 WHILE MOUSE(2,0):WEND
3720 COLOR 7,0:CLS
3730 MOUSE 1,,,0
3740 GOSUB *GET_16
3750 FOR X1=0 TO 1
3760 FOR Y=0 TO 15
3770 LOCATE X1*40,Y
3780 FOR X=0 TO 14
3790 PRINT RIGHT$(STR$(A(X1,X,Y)),1);",";
3800 NEXT
3810 PRINT RIGHT$(STR$(A(X1,X,Y)),1);
3820 IF X1=0 THEN M$=A$ ELSE M$=D$
3830 O$=HEX$(ASC(MID$(M$,1+Y*2,1)))
3840 IF LEN(O$)=1 THEN O$="0"+O$
3850 P$=HEX$(ASC(MID$(M$,2+Y*2,1)))
3860 IF LEN(P$)=1 THEN P$="0"+P$
3870 PRINT " ";O$;" ";P$
3880 NEXT
3890 NEXT
3900 PRINT SPC(13);"andパターン";SPC(26);"ドットパターン"
3910 WHILE INKEY$<>"":WEND
3920 WHILE INKEY$="" AND NOT(MOUSE(2,0)):WEND
3930 *終了:MOUSE 5:END
3940 '
3950 '
3960 '
3970 '★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
3980 '★ プログラム開発支援シリーズ第5弾 ★
3990 '★ 文字列編集サブルーチン TYPE A v1.01 ★
4000 '★ 94年8月19日(金) (C)渡辺 良一 ★
4010 '★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
4020 '
4030 '変数紹介(先頭の『E_』は省略)
4040 ' 文字$ ……… 編集する文字列
4050 ' X,Y ……… 文字を表示する文字座標
4060 ' 字数 ……… 編集する文字の最大の長さ(半角計算)
4070 ' CR0 ……… 背景色
4080 ' CR1 ……… カーソルの色
4090 ' CR ……… カーソル移動時に使用
4100 ' M ……… 文字入力時に使用
4110 ' XX ……… カーソルを表示するX文字座標
4120 ' C ……… カーソルの文字列中の位置(文字数で)
4130 ' I,I2 ……… カーソルを移動させる文字座標
4140 ' K$,K ……… 入力された文字とそのキャラクタコード
4150 '
4160 *文字編集
4170 CALLM 0
4180 GOSUB *E_文字表示
4190 E_XX=LEN(E_文字$):E_C=KLEN(E_文字$)
4200 E_CR=E_CR1:GOSUB *E_書く
4210 *E_INKEY
4220 E_K$=INKEY$
4230 IF MOUSE(2,1) THEN 取消=1:RETURN '右クリック
4240 IF E_K$="" THEN *E_INKEY
4250 E_K=ASC(E_K$)
4260 ' ↓実行キー
4270 IF E_K=13 THEN GOSUB *E_消す :RETURN
4280 IF E_K=24 THEN GOSUB *E_消す:取消=1:RETURN
4290 ' ↑取消キー
4300 IF E_K=5 AND E_XX<LEN(E_文字$) THEN *E_一括削除
4310 IF E_K=8 AND E_C >0 THEN *E_後退
4320 IF E_K=127 THEN IF E_XX<LEN(E_文字$) THEN *E_削除 ELSE *E_INKEY
4330 IF E_K=28 AND E_XX<LEN(E_文字$) THEN E_I= 1:GOTO *E_左右移動 '右
4340 IF E_K=29 AND E_C >0 THEN E_I=-1:GOTO *E_左右移動 '左
4350 IF E_K<32 THEN *E_INKEY '↓日本語文字なら次も入力する
4360 IF (127<E_K AND E_K<160) OR 223<E_K THEN E_K$=E_K$+INKEY$
4370 '**** 文字入力 *********
4380 E_M=LEN(E_文字$+E_K$)
4390 IF E_M>E_字数 THEN BEEP:CALLM 0:GOTO *E_INKEY
4400 E_文字$=KLEFT$(E_文字$,E_C)+E_K$+KMID$(E_文字$,E_C+1)
4410 E_I=1:E_I2=LEN(E_K$):GOSUB *E_文字表示:GOTO *E_移動
4420 '
4430 *E_一括削除
4440 E_文字$=KLEFT$(E_文字$,E_C)+STRING$(LEN(E_文字$)-E_C,32)
4450 GOSUB *E_文字表示
4460 E_文字$=KLEFT$(E_文字$,E_C)
4470 GOTO *E_INKEY
4480 *E_後退
4490 IF KTYPE(E_文字$,E_C) THEN E_I2=-2 ELSE E_I2=-1
4500 E_文字$=KLEFT$(E_文字$,E_C-1)+KMID$(E_文字$,E_C+1)
4510 GOSUB *E_文字表示:E_I=-1:GOTO *E_移動
4520 *E_削除
4530 E_文字$=KLEFT$(E_文字$,E_C)+KMID$(E_文字$,E_C+2)
4540 GOSUB *E_文字表示
4550 GOTO *E_INKEY
4560 *E_左右移動 '↓右移動なら+1 ↓日本語文字ならば
4570 IF KTYPE(E_文字$,29-E_K +E_C) THEN E_I2=E_I*2 ELSE E_I2=E_I
4580 '************************
4590 *E_移動
4600 E_C=E_C+E_I
4610 GOSUB *E_消す
4620 E_CR=E_CR1:E_XX=E_XX+E_I2
4630 GOSUB *E_表示
4640 GOTO *E_INKEY
4650 *E_消す:E_CR=E_CR0:GOSUB *E_書く:RETURN 'カーソル消す
4660 *E_表示:E_CR=E_CR1:GOSUB *E_書く:RETURN 'カーソル表示
4670 *E_書く:LINE((E_X+E_XX)*8,E_Y*19)-STEP(1,15),PSET,E_CR,B:RETURN
4680 *E_文字表示:LOCATE E_X,E_Y:PRINT E_文字$;" ":RETURN
4690 '
4700 '
4710 DATA 終わり,8,セーブ,8,ロード,8,クリア 16,8,クリア 32,8
4720 DATA " 黒",0," 白",7,透明,4